package com.sfzd5.exam.helplibrary;

import com.swetake.util.Qrcode;
import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

public class QrcodeHelper {

    /**
     * 编码字符串内容到目标File对象中
     *
     * @param encodeddata 编码的内容
     * @param formatName
     * @throws IOException
     */
    public static BufferedImage qrCodeEncode(String encodeddata, int size, String formatName) throws UnsupportedEncodingException {
        Qrcode qrcode = new Qrcode();
        /**
         * 纠错等级分为
         * level L : 最大 7% 的错误能够被纠正；
         * level M : 最大 15% 的错误能够被纠正；
         * level Q : 最大 25% 的错误能够被纠正；
         * level H : 最大 30% 的错误能够被纠正；
         */
        qrcode.setQrcodeErrorCorrect('L');    // 纠错级别（L 7%、M 15%、Q 25%、H 30%）和版本有关
        qrcode.setQrcodeEncodeMode('B'); ////注意版本信息 N代表数字 、A代表 a-z,A-Z、B代表 其他) B
        qrcode.setQrcodeVersion(0);        // 设置Qrcode包的版本 7
        byte[] d = encodeddata.getBytes("UTF-8");    // 字符集

        boolean[][] b = qrcode.calQrcode(d);

        int pointCount = b.length; // 每行点数
        int pointWidth = size / pointCount; //每点像素数，结合指定的宽度计算得出
        int border = (size - pointWidth * pointCount) / 2; //边距，计算得出

        BufferedImage bi = new BufferedImage(pointCount * pointWidth + border * 2, pointCount * pointWidth + border * 2, BufferedImage.TYPE_INT_RGB);
        // createGraphics	// 创建图层
        Graphics2D g = bi.createGraphics();

        g.setBackground(Color.WHITE);    // 设置背景颜色（白色）
        g.clearRect(0, 0, pointCount * pointWidth + border * 2, pointCount * pointWidth + border * 2);    // 矩形 X、Y、width、height
        g.setColor(Color.BLACK);    // 设置图像颜色（黑色）

        for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b.length; j++) {
                if (b[j][i]) {
                    g.fillRect(j * pointWidth + border, i * pointWidth + border, pointWidth, pointWidth);
                }
            }
        }

        g.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后，就不能再使用 Graphics 对象
        bi.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源

        return bi;
    }

    /**
     * 解析二维码，返回解析内容
     *
     * @param imageFile
     * @return
     */
    public static String qrCodeDecode(File imageFile) {
        String decodedData = null;
        BufferedImage image = null;
        try {
            image = ImageIO.read(imageFile);
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }

        try {
            QRCodeDecoder decoder = new QRCodeDecoder();
            QRCodeImage j2SEImage = new J2SEImage(image);
            decodedData = new String(decoder.decode(j2SEImage), "UTF-8");
            System.out.println("Output Decoded Data is：" + decodedData);
        } catch (DecodingFailedException dfe) {
            System.out.println("Error: " + dfe.getMessage());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return decodedData;
    }

    public static void main(String[] args) {

        // 二维码内容
        String encodeddata = "{stuid=21545411245;qid=254754}";
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            BufferedImage bi = QrcodeHelper.qrCodeEncode(encodeddata, 70, "png");
            ImageIO.write(bi, "png", byteArrayOutputStream);
            System.out.println("Input Encoded data is：" + encodeddata);
        } catch (IOException e) {
            e.printStackTrace();
        }

        String FilePath = "d:/w.png";
        File qrFile = new File(FilePath);
        /*
        try {
            FileUtils.writeByteArrayToFile(qrFile, byteArrayOutputStream.toByteArray(), false);
        } catch (IOException e) {
            e.printStackTrace();
        }
        */

        // 解码
        String reText = QrcodeHelper.qrCodeDecode(qrFile);
        //System.out.println(reText);
    }
}
